package com.zh.mycommon.util;

import com.zh.mycommon.value.Tuple2;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @author Zhou
 * @date 21:18 2025/5/30
 */
public class MyFilenameUtil {

    /**
     * 获取文件名扩展名
     * @param name 文件名
     * @return 扩展名，如果没有则返回空
     */
    public static String getExtension(String name){
        if (name == null) {
            return "";
        }
        return name.contains(".") ? name.substring(name.lastIndexOf(".")+ 1) : "";
    }

    /**
     * 获取文件保存路径，自动处理目录创建和文件名冲突
     *
     * @param subPath  子路径
     * @param filename 文件名
     * @return 处理后的文件保存路径
     * @throws IOException 如果创建目录或检查文件存在性时出错
     */
    @NotNull
    public static String getSaveFilePath(@NotNull String subPath, @NotNull String filename) throws IOException {
        Path downloadsDir = downloadsDirectory();
        Path targetDir = downloadsDir.resolve(subPath);

        // 确保目录存在
        Files.createDirectories(targetDir);

        // 检查文件是否存在，不存在则直接返回
        Path initialPath = targetDir.resolve(filename);
        if (!Files.exists(initialPath)) {
            return initialPath.toString();
        }

        // 处理文件重名情况
        return generateIncrementedPath(targetDir, filename).toString();
    }

    /**
     * 生成自动递增的文件名路径
     *
     * @param dir          目标目录
     * @param originalName 原始文件名
     * @return 处理后的文件路径
     * @throws IOException 如果检查文件存在性时出错
     */
    @NotNull
    private static Path generateIncrementedPath(@NotNull Path dir, @NotNull String originalName) throws IOException {
        var tuple2 = splitFileName(originalName);
        int counter = 1;

        while (true) {
            var newName = String.format("%s(%d)%s", tuple2.v1(), counter, tuple2.v2());
            Path path = dir.resolve(newName);

            if (!Files.exists(path)) {
                return path;
            }
            counter++;
        }
    }

    /**
     * 分割文件名和扩展名
     *
     * @param filename 文件名
     * @return 包含基础名和扩展名的对象
     */
    @NotNull
    private static Tuple2<String, String> splitFileName(@NotNull String filename) {
        int dotIndex = filename.lastIndexOf('.');
        if (dotIndex == -1 || dotIndex == 0) {
            return new Tuple2<>(filename, "");
        }
        return new Tuple2<>(filename.substring(0, dotIndex), filename.substring(dotIndex));
    }


    /**
     * 获取用户的下载目录
     *
     * @return Path
     */
    public static Path downloadsDirectory() {
        // 获取用户主目录
        var homeDir = System.getProperty("user.home");
        // 尝试常见的下载目录位置
        String[] downloadsDirs = {
                Paths.get(homeDir, "Downloads").toString(),
                Paths.get(homeDir, "下载").toString()
        };

        // 检查目录是否存在且为目录类型
        for (String dir : downloadsDirs) {
            Path path = Paths.get(dir);
            if (Files.exists(path) && Files.isDirectory(path)) {
                return path;
            }
        }
        // 如果找不到特定的下载目录，返回主目录
        return Paths.get(homeDir);
    }

    /**
     * 获取用户的TmpDirectory
     *
     * @return Path
     */
    public static Path userTempDirectory() {
        var tmpDir = Paths.get(System.getProperty("java.io.tmpdir"));
        if (!Files.exists(tmpDir)) {
            throw new InternalError("null property: java.io.tmpdir");
        }
        return tmpDir;
    }
}
